#include <stdio.h>

/*
 * 顶层const(top-level const) 表示指针本身是个常量，
 * 而底层const(low-level const) 表示指针所指的对象是一个常量
*/

int main (int argc, char* argv[]) {
    int i = 0;
    int j = -1;
    int *const p1 = &i;        // 不能改变 p1 的值， 这是一个顶层 const
    const int ci = 42;         // 不能改变 ci 的值， 这是一个顶层 const
    const int *p2 = &ci;        // 允许改变 p2 的值， 这是一个底层 const
    const int *const p3 = p2;  // 靠右的 const 是顶层 const, 靠左的是底层 const
    int *const &r = p1;        // 用于声明引用的 const 都是底层 const

    // 1. p1
    /* error: 不可以设置 p1 的值
    p1 = &j;
    */
    *p1 = 2;
    printf("*p1 = %d: 顶层 const 可以设置 *p1 的值\n", *p1);

    // 3. p2
    p2 = &i;
    printf("*p2 = %d: 底层 const 可以设置 p2 的值\n", *p2);
    /* error: 不可以设置 *p2 的值
    *p2 = 4;
    */

    return 0;
}
